/**
 * @file Params.h
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief 全局参数类
 */

#ifndef __PARAMS_H__
#define __PARAMS_H__

#include "def.h"
#include "PIDController.h"

/**
 * @brief 全局参数
 */
class Params {
    public:
        /* 地图号 */
        int map;

        /* 运动控制 */
        PIDParam_t FORWARD_PID_EMPTY = PIDParam_t(2.32, 0, 1e-1, 2); // 空载时的前进PID参数
        PIDParam_t FORWARD_PID_FULL = PIDParam_t(2.23, 0, 1e-1, 1.5); // 满载时的前进PID参数
        double FORWARD_FINISH_PRECISION = 0.3; // 前进PID判定控制是否完成时的控制精度
        PIDParam_t ROTATE_PID_EMPTY = PIDParam_t(30, 8); // 空载时的旋转PID参数
        PIDParam_t ROTATE_PID_FULL = PIDParam_t(20, 8); // 满载时的旋转PID参数
        double ROTATE_FINISH_PRECISION = 0.1; // 旋转PID判定控制是否完成时的控制精度
        double ROTATE_CAN_RUN_PRECISION = PI/3.5; // 旋转PID判定是否可以前进的控制精度
        double WAIT_ROTATE_SPEED_EMPTY = 6; // 空载时等待旋转任务完成的最大速度
        double WAIT_ROTATE_SPEED_FULL = 6; // 满载时等待旋转任务完成的最大速度

        /* 寻路 */
        double LINE_COST = 1; //  直线一格消耗
        double INCLINE_COST = 1.414; // 斜线一格消耗
        double OBSTACLE_COST = 1.5; // 目标格周围障碍物数量消耗
        double ROTATE_COST = 1.414; // 旋转PI/4消耗

        /* 避让 */
        double IN_PATH_COST = 1; // 在冲突格上移动的消耗
        int FORCAST_STEPS = 50; // 冲突检测的步数
        int SAFETY_STEPS = 20; // 安全检测的步数
        int SAFETY_DISTANCE_EMPTY = ROBOT_WIDTH_EMPTY + 1; // 空载时安全距离
        int SAFETY_DISTANCE_FULL = ROBOT_WIDTH_FULL + 2; // 满载时安全距离

        /* 规划 */
        int STEP_FRAMES_EMPTY = 4; // 空载走一步消耗的帧数
        int STEP_FRAMES_FULL = 5; // 满载走一步消耗的帧数
        int GAP_FRAMES = 0; // 结束时不分配方案的预留帧数
        int REPLAN_FRAMES = 100; // 没有方案分配时的等待帧数
        double BENCH9_LOSS_RATE = 0.2; // 把非7号货物卖给9号工作台的价值损失率

    public:
        void setMap(int map = 0);
        Params() {setMap();}
};

extern Params PARAMS;

#endif // __PARAMS_H__
